/*
 * Copyright 2008-2023 dexian.vip. All rights reserved.
 * Support: http://www.dexian.vip
 * License: http://www.dexian.vip/license
 */

package vip.dexian.code.config;

import vip.dexian.code.path.admin.AdminPathUtils;
import vip.dexian.code.template.enums.TemplateEnum;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;

import java.io.File;

/**
 * 包名
 *
 * @author 挺好的 2023年06月06日 13:16
 */
@Getter
@Setter
public class Template {

    /**
     * 创建模板
     *
     * @param templateEnum
     *         模板
     * @param entityClass
     *         实体类class
     * @param isOverride
     *         如果原文件存在，是否覆盖
     */
    public Template (TemplateEnum templateEnum, Class entityClass, boolean isOverride, PathUtilsType pathUtilsType) {

        if (entityClass == null) {
            throw new IllegalArgumentException("entityClass 不能为空");
        }

        Path path = null;

        switch (pathUtilsType) {
            case ADMIN:
                path = AdminPathUtils.getPath(templateEnum);
                break;
            default:
        }

        if (path == null) {
            throw new IllegalArgumentException("无法从模板中获取相应的path！模板" + this.templatePath);
        }

        this.templateEnum         = templateEnum;
        this.templatePath         = templateEnum.getAbsolutePath();
        this.basePackage          = path.getBasePackage();
        this.toDirectory          = path.getBaseFilePath();
        this.requestMappingPrefix = path.getRequestMappingPrefix();

        if (TemplateEnum.SQL.equals(templateEnum)) {
            this.fileName = this.toDirectory + entityClass.getSimpleName() + ".sql";
        } else {
            this.fileName = this.toDirectory + entityClass.getSimpleName() + templateEnum.getName() + templateEnum.getSuffix();
        }

        this.templateKey = StringUtils.uncapitalize(templateEnum.getName());

        this.graphName = AnnotationUtils.getInstance(entityClass).getNamedEntityGraph();

        this.isOverride = isOverride;

        this.entityClass = entityClass;

    }

    /**
     * 是否可以写入， 如果是覆盖原文件，返回true。 如果是实体图（可有可无），如果有定义注解，返回true，否则返回false
     *
     * @return
     */
    public Pair <Boolean, String> canWrite () {

        //如果是生成实体图并且没有实体图的定义，返回false
        if (TemplateEnum.GRAPH.equals(this.templateEnum) && StringUtils.isEmpty(this.graphName)) {
            return Pair.of(false, "实体图不存在");
        }

        boolean isFileExists = this.isFileExists();

        // 文件不存在，返回true
        if (!isFileExists) {
            return Pair.of(true, null);
        }

        // 如果是覆盖原文件，返回true
        if (this.isOverride) {
            return Pair.of(true, null);
        }

        return Pair.of(false,
                this.basePackage + "." + this.entityClass.getSimpleName() + this.templateEnum.getName() + "已存在"
        );
    }

    /**
     * 文件是否存在
     *
     * @return
     */
    private boolean isFileExists () {
        File file = new File(this.fileName);
        return file.exists();
    }

    /**
     * 是否覆盖原文件
     */
    private boolean isOverride;

    /**
     * 模板文件路径
     */
    private String templatePath;

    /**
     * 包名
     */
    private String basePackage;

    /**
     * 写入文件目录
     */
    private String toDirectory;

    /**
     * 文件名称
     */
    private String fileName;

    /**
     * controller requestMapping 路径前缀。如/admin
     */
    private String requestMappingPrefix;

    /**
     * 使用templateEnum 的 name，该字段主要作为设置到freemarker modelMap中时，做key的区分
     */
    private String templateKey;

    /**
     * 实体图名称
     */
    private String graphName;

    /**
     * 模板
     */
    private TemplateEnum templateEnum;

    /**
     * 实体类class
     */
    private Class entityClass;


}
